package com.priox.sigar.application.job.mappers;

import com.priox.sigar.client.dto.OperacionCuentaDTO;
import com.priox.sigar.enums.TipoCuenta;
import com.priox.sigar.util.TimeObserver;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.validation.BindException;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;

/**
 * User: Matrix
 * Date: 10/02/13
 */

public class CuentaPorPagarFieldSetMapper implements FieldSetMapper<OperacionCuentaDTO> {


    private static final Logger ERRORLOG = LoggerFactory.getLogger("errorLog");
    private static final Logger LOG = LoggerFactory.getLogger(CuentaPorPagarFieldSetMapper.class);

    private Long checkPointId;
    private Long usuarioId;
    private Date fechaCorte;


    /*
     * (non-Javadoc)
     *
     * @see
     * org.springframework.batch.item.file.mapping.FieldSetMapper#mapFieldSet
     * (org.springframework.batch.item.file.transform.FieldSet)
     */
    public static void main(String[] args) {
        String patternNumeros = "[+-]*[0-9,0-9]*.[0-9]*";
        System.out.println("11".matches(patternNumeros));
        System.out.println("11.00".matches(patternNumeros));
        System.out.println("AAAgg8787".matches(patternNumeros));
        System.out.println("15,545,4".matches(patternNumeros));
        System.out.println("15,545,4.22".matches(patternNumeros));
        System.out.println("4.22".matches(patternNumeros));
        System.out.println("-4.22".matches(patternNumeros));
    }
    public OperacionCuentaDTO mapFieldSet(FieldSet fieldSet) throws BindException {
        OperacionCuentaDTO result = new OperacionCuentaDTO();
        String patternFecha = "^\\d{2}.\\d{2}.\\d{4}$";
        String patternNumeros = "[+-]*[0-9,0-9]*.[0-9]*";

        try {
            if (fieldSet.getFieldCount() < 20) {
                return result;
            }

            String[] columnas = fieldSet.getValues();

            int index = 0;
            for (String columna : columnas) {
                switch (index) {
                    case 0: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setSociedadId(columna);
                            index++;
                        }

                        break;
                    }
                    case 1: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCuentaContableId(columna);
                            index++;
                        }
                        break;
                    }
                    case 2: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setNumeroDocumento(columna);
                            index++;
                        }
                        break;
                    }
                    case 3: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setAcreedorId(columna);
                            index++;
                        }

                        break;
                    }
                    case 4: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setAcreedorDocumento(columna);
                        }
                        index++;
                        break;
                    }
                    case 5: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setAcreedorRazonSocial(columna);
                            index++;
                        }
                        break;
                    }
                    case 6: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setReferencia(columna);

                        }
                        index++;
                        break;
                    }
                    case 7: {
                        if (StringUtils.isNotBlank(columna)) {
                            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                            String value = columna;
                            if (StringUtils.isNotBlank(value) && value.matches(patternFecha)) {
                                result.setFechaContable(sdf.parse(value));
                            }
                            index++;
                        }

                        break;
                    }
                    case 8: {
                        if (StringUtils.isNotBlank(columna)) {
                            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                            String value = columna;
                            if (StringUtils.isNotBlank(value) && value.matches(patternFecha)) {
                                result.setFechaDocumento(sdf.parse(value));
                            }
                            index++;
                        }

                        break;
                    }
                    case 9: {
                        if (StringUtils.isNotBlank(columna)) {
                            String  value = columna;
                            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                            if (StringUtils.isNotBlank(value) && value.matches(patternFecha)) {
                                result.setFechaBase(sdf.parse(value));

                            }
                            index++;
                        }

                        break;
                    }
                    case 10: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setcPag(columna);

                        }
                        index++;
                        break;
                    }
                    case 11: {
                        if (StringUtils.isNotBlank(columna)) {
                            SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                            String value = columna;
                            if (StringUtils.isNotBlank(value) && value.matches(patternFecha)) {
                                result.setFechaVencimientoNeto(sdf.parse(columna));
                            }
                            index++;
                        }

                        break;
                    }
                    case 12: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoClas(columna);
                            index++;
                        }

                        break;
                    }
                    case 13: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoLl(columna);

                        }
                        index++;
                        break;
                    }
                    case 14: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoVp(columna);

                        }
                        index++;
                        break;
                    }
                    case 15: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoIr(columna);

                        }
                        index++;
                        break;
                    }
                    case 16: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoBp(columna);

                        }
                        index++;
                        break;
                    }
                    case 17: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setCodigoMoneda(columna);
                            index++;
                        }
                        break;
                    }
                    case 18: {
                        if (StringUtils.isNotBlank(columna) && columna.matches(patternNumeros)) {
                            result.setMontoMonedaLocal(new BigDecimal(columna.replace(",","")));
                            index++;
                        }

                        break;
                    }
                    case 19: {
                        if (StringUtils.isNotBlank(columna)&& columna.matches(patternNumeros)) {
                            result.setMontoMonedaDolares(new BigDecimal(columna.replace(",","")));
                            index++;
                            index++;
                        }


                        break;
                    }
                    case 21: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setUsuario(columna);
                            index++;

                        }

                        break;
                    }case 22: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setDocComp(columna);

                        }
                        index++;
                        break;
                    }case 23: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setAnuladoCon(columna);

                        }
                        index++;
                        break;
                    }case 24: {
                        if (StringUtils.isNotBlank(columna)) {


                        }
                        index++;
                        break;
                    }case 25: {
                        if (StringUtils.isNotBlank(columna)&& columna.matches(patternNumeros)) {
                            result.setMontoImporteValorado(new BigDecimal(columna.replace(",","")));
                            index++;
                        }

                        break;
                    }case 26: {
                        if (StringUtils.isNotBlank(columna)) {
                            result.setTexto(columna);

                        }
                        index++;
                        break;
                    }
                }
            }


            result.setTipoCuenta(TipoCuenta.CUENTA_X_PAGAR);
            result.setCheckPointId(checkPointId);
            result.setUsuarioId(usuarioId);
            result.setFechaCorte(fechaCorte);
        } catch (Exception ex) {
            ex.printStackTrace();
            ERRORLOG.debug(ex.getMessage());
        }

        return result;
    }

    public Long getCheckPointId() {
        return checkPointId;
    }

    public void setCheckPointId(Long checkPointId) {
        this.checkPointId = checkPointId;
    }

    public Long getUsuarioId() {
        return usuarioId;
    }

    public void setUsuarioId(Long usuarioId) {
        this.usuarioId = usuarioId;
    }

    public Date getFechaCorte() {
        return fechaCorte;
    }

    public void setFechaCorte(Date fechaCorte) {
        this.fechaCorte = fechaCorte;
    }
}


